Dasturchilar uchun brauzer kengaytmalarini Manifest V3 ga o'tkazish bo'yicha to'liq qo'llanma, JavaScript API o'zgarishlari va global auditoriya uchun samarali migratsiya strategiyalariga e'tibor qaratilgan.
O'zgarishlarga moslashish: Brauzer kengaytmalari uchun Manifest V3 JavaScript API migratsiya strategiyalari
Brauzer kengaytmalarini ishlab chiqish sohasi doimiy ravishda rivojlanib bormoqda. So'nggi yillardagi eng muhim o'zgarishlardan biri bu Manifest V3 (MV3) ning joriy etilishi bo'ldi. Google Chrome boshchiligidagi, ammo boshqa Chromium-ga asoslangan brauzerlar va tobora ko'proq Firefox-ga ta'sir ko'rsatayotgan ushbu yangilanish butun dunyo bo'ylab foydalanuvchilar uchun xavfsizlik, maxfiylik va ishlash unumdorligini oshirishga qaratilgan. Dasturchilar uchun ushbu o'tish o'zgarishlarni, ayniqsa JavaScript API-lariga oid o'zgarishlarni chuqur tushunishni talab qiladi. Ushbu keng qamrovli qo'llanma sizni mavjud Manifest V2 kengaytmangizni MV3-ga samarali o'tkazish uchun bilim va strategiyalar bilan ta'minlaydi, bu esa ijodingiz yangi muhitda ishlashda va rivojlanishda davom etishini ta'minlaydi.
Manifest V3 dagi asosiy o'zgarishlarni tushunish
Manifest V3 brauzer kengaytmalarining ishlash tartibini tubdan qayta ko'rib chiqishni anglatadi. Ushbu o'zgarishlarning asosiy sabablari quyidagilardir:
- Kuchaytirilgan xavfsizlik: MV3 kengaytmalar bajarishi mumkin bo'lgan kod turlarini va ularning veb-sahifalar bilan o'zaro aloqasini cheklaydigan qattiqroq xavfsizlik siyosatini joriy etadi.
- Yaxshilangan maxfiylik: Yangi model ma'lum sezgir API-larga kirishni cheklash va ma'lumotlar bilan ishlashning yanada shaffof usullarini rag'batlantirish orqali foydalanuvchi maxfiyligiga urg'u beradi.
- Yaxshiroq ishlash unumdorligi: Ba'zi eski arxitekturalardan voz kechish orqali, MV3 kengaytmalarning brauzer tezligi va resurs sarfiga ta'sirini kamaytirishni maqsad qilgan.
JavaScript API nuqtai nazaridan eng ta'sirli o'zgarishlar quyidagilarga bog'liq:
- Fon sahifalarini (Background Pages) Service Workerlar bilan almashtirish: Doimiy fon sahifasi modeli hodisaga asoslangan servis xodimlari bilan almashtirilmoqda. Bu sizning fon mantig'ingiz faqat kerak bo'lganda ishlashini anglatadi, bu esa ishlash unumdorligini sezilarli darajada oshirishi mumkin, ammo holatni boshqarish va hodisalarni qayta ishlash uchun boshqacha yondashuvni talab qiladi.
- Web Request API modifikatsiyasi: Tarmoq so'rovlarini ushlab qolish uchun keng qo'llaniladigan kuchli `chrome.webRequest` API MV3-da sezilarli darajada cheklanmoqda. U maxfiylikni yaxshiroq saqlaydigan va samaraliroq, ammo kamroq moslashuvchan yondashuvni taklif qiluvchi `declarativeNetRequest` API bilan almashtirilmoqda.
- Kontent skriptlarining (Content Script) bajarilishidagi o'zgarishlar: Kontent skriptlari saqlanib qolgan bo'lsa-da, ularning bajarilish konteksti va imkoniyatlari takomillashtirilgan.
- `eval()` va `new Function()` ni olib tashlash: Xavfsizlik nuqtai nazaridan, `eval()` va `new Function()` ni kengaytma kodida ishlatishga ruxsat berilmaydi.
Asosiy JavaScript API migratsiyalari va strategiyalari
Keling, asosiy JavaScript API-larini ko'chirishning o'ziga xos xususiyatlarini ko'rib chiqamiz va har biri uchun samarali strategiyalarni o'rganamiz.
1. Fon skriptidan Service Workerga migratsiya
Bu, shubhasiz, eng fundamental o'zgarishdir. Manifest V2 kengaytmalari ko'pincha doimiy ishlaydigan fon sahifalariga tayangan. Manifest V3 esa service workerlarni joriy etadi, ular hodisaga asoslangan bo'lib, faqat hodisa (masalan, kengaytmaning o'rnatilishi, brauzerning ishga tushishi yoki kontent skriptidan xabar kelishi) bilan ishga tushirilganda ishlaydi.
Nima uchun o'zgartirildi?
Doimiy fon sahifalari, ayniqsa ko'plab kengaytmalar faol bo'lganda, sezilarli resurslarni iste'mol qilishi mumkin edi. Service workerlar samaraliroq modelni taklif qiladi, bu kengaytma mantig'i faqat kerak bo'lganda ishlashini ta'minlaydi, natijada brauzer tezroq ishga tushadi va xotira sarfi kamayadi.
Migratsiya strategiyalari:
- Hodisaga asoslangan mantiq: Fon mantig'ingizni hodisaga asoslangan qilib qayta tuzing. Fon skriptingiz doimo mavjud deb o'ylash o'rniga, ma'lum hodisalarni tinglang. Service workingiz uchun asosiy kirish nuqtasi odatda `install` hodisasi bo'ladi, bu yerda siz tinglovchilarni o'rnatishingiz va kengaytmangizni ishga tushirishingiz mumkin.
- Xabar almashinuvi: Service workerlar doim ham faol bo'lmaganligi sababli, kengaytmaning turli qismlari (masalan, kontent skriptlari, qalqib chiquvchi oynalar, sozlamalar sahifalari) va service worker o'rtasida asinxron xabar almashinuviga ko'proq tayanasiz. Aloqa uchun `chrome.runtime.sendMessage()` va `chrome.runtime.onMessage()` dan foydalaning. Xabar ishlovchilaringiz mustahkam ekanligiga va service worker faollashtirilishi kerak bo'lsa ham xabarlarni qayta ishlay olishiga ishonch hosil qiling.
- Holatni boshqarish: Doimiy fon sahifalari xotirada global holatni saqlab turishi mumkin edi. Service workerlar bilan, ishchi to'xtatilganda bu holat yo'qolishi mumkin. Service worker to'xtatilgandan keyin ham saqlanishi kerak bo'lgan holatni saqlash uchun
chrome.storage(`local` yoki `sync`) dan foydalaning. - Hayot siklidan xabardorlik: Service worker hayot siklini tushuning. U faollashtirilishi, o'chirilishi va qayta ishga tushirilishi mumkin. Sizning kodingiz ushbu o'tishlarni muammosiz hal qilishi kerak. Masalan, faollashtirishda har doim hodisa tinglovchilarini qayta ro'yxatdan o'tkazing.
- Misol:
Manifest V2 (background.js):
chrome.runtime.onInstalled.addListener(() => { console.log('Kengaytma o\'rnatildi. Tinglovchilar o\'rnatilmoqda...'); chrome.alarms.create('myAlarm', { periodInMinutes: 1 }); }); chrome.alarms.onAlarm.addListener((alarm) => { if (alarm.name === 'myAlarm') { console.log('Signal ishga tushdi!'); // Orqa fonda biror vazifani bajarish } });Manifest V3 (service-worker.js):
// Service workerni o'rnatish chrome.runtime.onInstalled.addListener(() => { console.log('Kengaytma o\'rnatildi. Signallar o\'rnatilmoqda...'); chrome.alarms.create('myAlarm', { periodInMinutes: 1 }); }); // Signallar uchun hodisa tinglovchisi chrome.alarms.onAlarm.addListener((alarm) => { if (alarm.name === 'myAlarm') { console.log('Signal ishga tushdi!'); // Orqa fonda biror vazifani bajarish // Eslatma: Agar service worker to'xtatilgan bo'lsa, u ushbu hodisa uchun uyg'otiladi. } }); // Ixtiyoriy: Kengaytmaning boshqa qismlaridan kelgan xabarlarni qayta ishlash chrome.runtime.onMessage.addListener((request, sender, sendResponse) => { if (request.action === 'getData') { // Ma'lumotlarni olishni simulyatsiya qilish sendResponse({ data: 'Service workerdan olingan qandaydir ma\'lumot' }); } return true; // Asinxron javob uchun xabar kanalini ochiq saqlash });
2. `chrome.webRequest` ni `declarativeNetRequest` bilan almashtirish
`chrome.webRequest` API tarmoq so'rovlarini ushlab qolish, bloklash, o'zgartirish va yo'naltirish uchun keng imkoniyatlarni taqdim etgan. Manifest V3 da uning kuchi xavfsizlik va maxfiylik sababli sezilarli darajada cheklangan. Asosiy o'rnini bosuvchi bu `declarativeNetRequest` APIdir.
Nima uchun o'zgartirildi?
`webRequest` API kengaytmalarga brauzer tomonidan qilingan har bir tarmoq so'rovini tekshirish va o'zgartirish imkonini bergan. Bu maxfiylik xavfini tug'dirgan, chunki kengaytmalar potentsial ravishda maxfiy foydalanuvchi ma'lumotlarini yozib olishi mumkin edi. Shuningdek, har bir so'rovni JavaScript orqali ushlab qolish sekin bo'lishi mumkinligi sababli unumdorlikka ta'sir qilgan. `declarativeNetRequest` ushlab qolish mantig'ini brauzerning mahalliy tarmoq stekiga o'tkazadi, bu esa unumdorroq va maxfiylikni yaxshiroq saqlaydi, chunki kengaytma aniq ruxsat berilmagan bo'lsa, so'rov tafsilotlarini to'g'ridan-to'g'ri ko'rmaydi.
Migratsiya strategiyalari:
- Deklarativ qoidalarni tushunish: Imperativ kod o'rniga, `declarativeNetRequest` deklarativ yondashuvdan foydalanadi. Siz mos keladigan tarmoq so'rovlarida qanday harakatlarni bajarishni (masalan, bloklash, yo'naltirish, sarlavhalarni o'zgartirish) belgilaydigan qoidalar to'plamini (JSON obyektlari) aniqlaysiz.
- Qoidalarni aniqlash: Qoidalar shartlarni (masalan, URL andozalari, resurs turlari, domenlar) va harakatlarni belgilaydi. `webRequest` bloklash yoki yo'naltirish mantig'ingizni ushbu qoidalar to'plamiga tarjima qilishingiz kerak bo'ladi.
- Qoidalar chegaralari: Ro'yxatdan o'tkazishingiz mumkin bo'lgan qoidalar va qoidalar to'plamlari sonining chegaralaridan xabardor bo'ling. Murakkab filtrlash stsenariylari uchun siz qoidalar to'plamini dinamik ravishda yangilashingiz kerak bo'lishi mumkin.
- Dinamik o'zgartirishning yo'qligi: `webRequest` dan farqli o'laroq, `declarativeNetRequest` so'rov tanalari yoki sarlavhalarini xuddi shunday dinamik tarzda o'zgartirishga imkon bermaydi. Agar kengaytmaning asosiy funksiyasi so'rovni chuqur o'zgartirishga bog'liq bo'lsa, uning dizaynini qayta baholashingiz yoki muqobil yondashuvlarni o'rganishingiz kerak bo'lishi mumkin.
- Bloklash va yo'naltirish: So'rovlarni bloklash oddiy. Yo'naltirish uchun siz yangi URL manzilini ko'rsatib, `redirect` harakatidan foydalanasiz.
- Sarlavhalarni boshqarish: MV3 so'rov sarlavhalarini o'zgartirishda cheklovlarga ega. Siz `declarativeNetRequest` da `requestHeaders` va `responseHeaders` yordamida ma'lum sarlavhalarni qo'shishingiz yoki olib tashlashingiz mumkin, ammo murakkab o'zgartirishlar qo'llab-quvvatlanmaydi.
- Unumdorlik masalalari: Odatda tezroq bo'lsa-da, ko'p sonli qoidalarni boshqarish hali ham unumdorlikka ta'sir qilishi mumkin. Qoidalar to'plamingizni samaradorlik uchun optimallashtiring.
- Misol:
Manifest V2 (rasmni bloklash):
chrome.webRequest.onBeforeRequest.addListener( function(details) { return { cancel: true }; }, { urls: ["*://*.example.com/*.png"] }, ["blocking"] );Manifest V3 (`declarativeNetRequest` yordamida):
Avval, qoidalaringizni JSON faylida aniqlang (masalan,
rules.json):[ { "id": 1, "priority": 1, "action": {"type": "block"}, "condition": { "urlFilter": "*.png", "domains": ["example.com"], "resourceTypes": ["image"] } } ]Keyin, service workingizda (yoki dastlabki sozlash skriptida):
chrome.runtime.onInstalled.addListener(() => { chrome.declarativeNetRequest.updateDynamicRules({ addRules: [ { "id": 1, "priority": 1, "action": {"type": "block"}, "condition": { "urlFilter": "*.png", "domains": ["example.com"], "resourceTypes": ["image"] } } ], removeRuleIds: [1] // Agar u allaqachon mavjud bo'lsa, o'chirish uchun }); });
3. Kontent skriptining bajarilishi va aloqasini boshqarish
Kontent skriptlari veb-sahifalar kontekstida ishlaydigan JavaScript fayllaridir. Ularning asosiy maqsadi bir xil bo'lib qolsa-da, MV3 ularning qanday bajarilishi va kengaytmaning qolgan qismi bilan o'zaro aloqasini takomillashtiradi.
Asosiy o'zgarishlar va strategiyalar:
- Bajarilish kontekstlari: Kontent skriptlari hali ham sahifalarga kiritilishi mumkin. Biroq, JavaScriptni to'g'ridan-to'g'ri `chrome.scripting.executeScript` orqali kiritish qobiliyati endi skriptlarni dasturiy ravishda kiritish uchun afzal ko'rilgan usuldir.
- Asinxron kiritish: `chrome.scripting.executeScript` dan foydalanganda, bajarilish asinxron bo'ladi. Kodingiz uning DOM yoki global sohasi bilan o'zaro aloqada bo'lishga urinishdan oldin skript kiritilishi va bajarilishini kutishiga ishonch hosil qiling.
- `frameId` dan xabardorlik: Agar kengaytmangiz iframe'lar bilan ishlasa, skriptlarni kiritishda yoki xabarlar yuborishda `frameId` xususiyatiga e'tibor bering.
- DOM ga kirish: DOM ga kirish asosiy vazifa bo'lib qolmoqda. Biroq, DOM manipulyatsiyasi xost sahifaning o'z skriptlariga xalaqit berishi mumkinligidan ehtiyot bo'ling.
- Service Worker bilan aloqa: Kontent skriptlari kengaytmaning backend mantig'ini talab qiladigan vazifalar uchun service worker (fon sahifasini almashtiruvchi) bilan aloqa qilishi kerak bo'ladi. `chrome.runtime.sendMessage()` va `chrome.runtime.onMessage()` dan foydalaning.
- Misol:
Skript kiritish va aloqa qilish (Manifest V3):
// Qalqib chiquvchi oynadan yoki sozlamalar sahifasidan chrome.scripting.executeScript({ target: { tabId: SIZNING_TAB_IDingiz }, files: ['content.js'] }, (results) => { if (chrome.runtime.lastError) { console.error(chrome.runtime.lastError); return; } console.log('Kontent skripti kiritildi:', results); // Endi kiritilgan kontent skripti bilan aloqa qiling chrome.tabs.sendMessage(SIZNING_TAB_IDingiz, { action: "processPage" }, (response) => { if (chrome.runtime.lastError) { console.error(chrome.runtime.lastError); return; } console.log('Kontent skriptidan javob:', response); }); }); // content.js da: chrome.runtime.onMessage.addListener((request, sender, sendResponse) => { if (request.action === "processPage") { console.log('Sahifa qayta ishlanmoqda...'); const pageTitle = document.title; // Biror DOM manipulyatsiyasi yoki ma'lumotlarni olishni bajaring sendResponse({ success: true, title: pageTitle }); } return true; // Asinxron javob uchun kanalni ochiq saqlash });
4. `eval()` va `new Function()` ni yo'q qilish
Xavfsizlik nuqtai nazaridan, Manifest V3 da kengaytma kodida `eval()` va `new Function()` dan foydalanish taqiqlangan. Bu funksiyalar ixtiyoriy kodni bajarishga imkon beradi, bu esa jiddiy xavfsizlik zaifligi bo'lishi mumkin.
Migratsiya strategiyalari:
- Kodni qayta qurish: Eng ishonchli yechim - dinamik kod bajarilishidan qochish uchun kodingizni qayta qurishdir. Agar siz funksiya nomlarini yoki kod parchalarini dinamik ravishda yaratsangiz, oldindan belgilangan tuzilmalar, konfiguratsiya obyektlari yoki andoza literallaridan foydalanishni ko'rib chiqing.
- JSON tahlili: Agar `eval()` JSONni tahlil qilish uchun ishlatilgan bo'lsa, `JSON.parse()` ga o'ting. Bu JSON ma'lumotlarini qayta ishlashning standart va xavfsiz usuli.
- Obyekt xaritalash: Agar `new Function()` kiritishga asoslangan holda dinamik ravishda funksiyalar yaratish uchun ishlatilgan bo'lsa, kiritishlarni oldindan belgilangan funksiyalarga xaritalash uchun obyekt xaritalari yoki switch iboralaridan foydalanishni o'rganing.
- Misol:
Oldin (Manifest V2, TAVSIYA ETILMAYDI):
const dynamicFunctionName = 'myDynamicFunc'; const code = 'console.log("Dinamik funksiyadan salom!");'; const dynamicFunc = new Function(code); dynamicFunc(); // Yoki JSON tahlili uchun: const jsonString = '{"key": "value"}'; const jsonData = eval('(' + jsonString + ')'); // XavfliKeyin (Manifest V3, Xavfsiz):
// Dinamik funksiyalar uchun: function myDynamicFunc() { console.log("Oldindan belgilangan funksiyadan salom!"); } // Agar uni satrga asoslanib dinamik ravishda chaqirish kerak bo'lsa, obyekt xaritasidan foydalanishingiz mumkin: const availableFunctions = { myDynamicFunc: myDynamicFunc }; const functionToCall = 'myDynamicFunc'; if (availableFunctions[functionToCall]) { availableFunctions[functionToCall](); } else { console.error('Funksiya topilmadi'); } // JSON tahlili uchun: const jsonString = '{"key": "value"}'; const jsonData = JSON.parse(jsonString); // Xavfsiz va standart console.log(jsonData.key); // "value"
5. Boshqa muhim API masalalari
Manifest V3 boshqa bir qancha API-larga ham ta'sir qiladi va bu o'zgarishlardan xabardor bo'lish juda muhim:
- `chrome.tabs` API: `chrome.tabs` API-dagi ba'zi usullar, ayniqsa tablarni yaratish va boshqarishga oid, boshqacha ishlashi mumkin. Eng so'nggi tavsiya etilgan naqshlardan foydalanayotganingizga ishonch hosil qiling.
- `chrome.storage` API: `chrome.storage` API (local va sync) asosan o'zgarishsiz qoladi va service worker to'xtatilganda ma'lumotlarni saqlash uchun juda muhimdir.
- Ruxsatnomalar: Kengaytmaning ruxsatnomalarini qayta baholang. MV3 faqat kerakli ruxsatnomalarni so'rashni rag'batlantiradi va yanada batafsil nazoratni taklif qiladi.
- Foydalanuvchi interfeysi elementlari: Kengaytmaning qalqib chiquvchi oynalari va sozlamalar sahifalari asosiy UI elementlari bo'lib qoladi. Ularning yangi service worker arxitekturasi bilan ishlashga yangilanganligiga ishonch hosil qiling.
Migratsiya uchun vositalar va eng yaxshi amaliyotlar
Kengaytmani ko'chirish murakkab jarayon bo'lishi mumkin. Yaxshiyamki, buni osonlashtiradigan vositalar va eng yaxshi amaliyotlar mavjud:
- Rasmiy hujjatlar: Brauzer ishlab chiqaruvchilarining (ayniqsa Chrome va Firefox) hujjatlari sizning asosiy manbangizdir. Manifest V3 migratsiya qo'llanmalarini diqqat bilan o'qib chiqing.
- Brauzer dasturchi vositalari: Maqsadli brauzeringizning dasturchi vositalaridan foydalaning. Ular xatolar, service worker hayot sikli va tarmoq faoliyati haqida bebaho ma'lumotlarni taqdim etadi.
- Bosqichma-bosqich migratsiya: Agar sizda katta kengaytma bo'lsa, bosqichma-bosqich migratsiya strategiyasini ko'rib chiqing. Bir vaqtning o'zida bir xususiyat yoki API-ni ko'chiring, sinchkovlik bilan sinab ko'ring va keyingisiga o'ting.
- Avtomatlashtirilgan testlash: Mustahkam testlar to'plamini joriy qiling. Avtomatlashtirilgan testlar regressiyalarni aniqlash va ko'chirilgan kengaytmaning turli stsenariylarda kutilganidek ishlashini ta'minlash uchun juda muhimdir.
- Kod linteri va tahlili: Potentsial muammolarni erta aniqlash uchun MV3 ishlab chiqish uchun sozlangan linterlardan (ESLint kabi) foydalaning.
- Jamoatchilik forumlari va qo'llab-quvvatlash: Dasturchilar jamoalari bilan muloqot qiling. Ko'pgina dasturchilar shunga o'xshash qiyinchiliklarga duch kelishmoqda va tajriba almashish samarali yechimlarga olib kelishi mumkin.
- Bloklangan funksionallik uchun alternativalarni ko'rib chiqish: Agar kengaytmaning asosiy xususiyati MV3 da qattiq cheklangan yoki olib tashlangan API-ga (masalan, `webRequest`ning ba'zi funksiyalari) tayangan bo'lsa, muqobil yondashuvlarni o'rganing. Bu hali ham mavjud bo'lgan brauzer API-laridan foydalanishni, mijoz tomonidagi evristikalarni qo'llashni yoki hatto xususiyatning amalga oshirilishini qayta ko'rib chiqishni o'z ichiga olishi mumkin.
Manifest V3 uchun global masalalar
Global auditoriyani maqsad qilgan dasturchilar sifatida, MV3 o'zgarishlari turli mintaqalar va kontekstlardagi foydalanuvchilarga qanday ta'sir qilishi mumkinligini hisobga olish muhimdir:
- Qurilmalar bo'ylab ishlash unumdorligi: Service workerlarning samaradorlik yutuqlari, ayniqsa ko'plab rivojlanayotgan bozorlarda keng tarqalgan kam quvvatli qurilmalarda yoki sekin internet aloqasiga ega bo'lgan foydalanuvchilar uchun foydalidir.
- Butun dunyo bo'ylab maxfiylik muammolari: MV3 da oshirilgan maxfiylik himoyasi o'sib borayotgan global ma'lumotlar maxfiyligi qoidalari (masalan, GDPR, CCPA) va foydalanuvchi kutishlariga mos keladi. Bu xilma-xil foydalanuvchilar bazasi orasida katta ishonchni shakllantirishi mumkin.
- Veb-standartlariga moslashish: MV3 asosan Chromium tomonidan boshqarilayotgan bo'lsa-da, yanada xavfsiz va maxfiylikni saqlaydigan veb-kengaytma modellariga intilish global tendensiyadir. Ushbu o'zgarishlardan oldinda bo'lish kengaytmalaringizni kengroq platforma mosligi va kelajakdagi veb-standartlarga tayyorlaydi.
- Hujjatlarning mavjudligi: Siz tayangan migratsiya resurslari, agar kerak bo'lsa, mavjud va aniq tarjima qilinganligiga ishonch hosil qiling. Ushbu post ingliz tilida bo'lsa-da, butun dunyodagi dasturchilar mahalliylashtirilgan resurslarni izlashi mumkin.
- Mintaqalar bo'ylab testlash: Agar kengaytmaning funksionalligi tarmoqqa bog'liq bo'lsa yoki turli joylarda nozik UI farqlariga ega bo'lishi mumkin bo'lsa, testlaringiz turli geografik joylashuvlar va tarmoq sharoitlarini qamrab olishiga ishonch hosil qiling.
Manifest V3 bilan brauzer kengaytmalarining kelajagi
Manifest V3 shunchaki yangilanish emas; bu yanada xavfsiz, maxfiy va unumdor veb-kengaytma ekotizimiga qaratilgan muhim qadamdir. Migratsiya qiyinchiliklarni keltirib chiqarsa-da, u dasturchilarga yaxshiroq va mas'uliyatliroq kengaytmalar yaratish imkoniyatini ham beradi. Asosiy API o'zgarishlarini tushunib, strategik migratsiya yondashuvlarini qabul qilib, brauzer kengaytmalaringiz dunyo bo'ylab foydalanuvchilar uchun dolzarb va qimmatli bo'lib qolishini ta'minlashingiz mumkin.
O'tishni qabul qiling, yangi imkoniyatlardan foydalaning va innovatsiyalarni davom ettiring. Brauzer kengaytmalarining kelajagi shu yerda va u kuchaytirilgan xavfsizlik va foydalanuvchi ishonchi poydevoriga qurilgan.